/**
**  Windows Live Messenger v8.0 Password Finder for Windows XP & 2003
**  (Compiled-VC++ 6.0 SP6, tested on WinXP SP2, Windows Live Messenger 8.0.0812.00)
**      - Gregory R. Panakkal
**/

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

//Following definitions taken from wincred.h
//[available only in Oct 2002 MS Platform SDK / LCC-Win32 Includes]

typedef struct _CREDENTIAL_ATTRIBUTEA {
    LPSTR Keyword;
    DWORD Flags;
    DWORD ValueSize;
    LPBYTE Value;
}
CREDENTIAL_ATTRIBUTEA,*PCREDENTIAL_ATTRIBUTEA;

typedef struct _CREDENTIALA {
    DWORD Flags;
    DWORD Type;
    LPSTR TargetName;
    LPSTR Comment;
    FILETIME LastWritten;
    DWORD CredentialBlobSize;
    LPBYTE CredentialBlob;
    DWORD Persist;
    DWORD AttributeCount;
    PCREDENTIAL_ATTRIBUTEA Attributes;
    LPSTR TargetAlias;
    LPSTR UserName;
} CREDENTIALA,*PCREDENTIALA;

typedef CREDENTIALA CREDENTIAL;
typedef PCREDENTIALA PCREDENTIAL;


////////////////////////////////////////////////////////////////////

typedef BOOL (WINAPI *typeCredEnumerate)(LPCTSTR, DWORD, DWORD *, PCREDENTIAL **);
typedef VOID (WINAPI *typeCredFree)(PVOID);

typeCredEnumerate pfCredEnumerate = NULL;
typeCredFree pfCredFree = NULL;

////////////////////////////////////////////////////////////////////

void showBanner()
{
    _tprintf(_T("Windows Live Messenger Password Finder for Windows XP & 2003\n"));
    _tprintf(_T("   - Gregory R. Panakkal, http://www.infogreg.com \n\n"));
}

////////////////////////////////////////////////////////////////////
int main()
{
    PCREDENTIAL *CredentialCollection = NULL;
    HMODULE hAdvapi32DLL = NULL;
    DWORD dwCount = 0;
    DWORD dwTempIndex = 0;
    BOOL bOK = FALSE;

    showBanner();

    do
    {
       
        hAdvapi32DLL = LoadLibrary(_T("advapi32.dll"));

        if(NULL == hAdvapi32DLL)
        {
            _tprintf(_T("Error loading advapi32.dll\n"));
            break;
        }


#ifdef _UNICODE
        pfCredEnumerate = (typeCredEnumerate)GetProcAddress(hAdvapi32DLL, "CredEnumerateW");
#else
        pfCredEnumerate = (typeCredEnumerate)GetProcAddress(hAdvapi32DLL, "CredEnumerateA");
#endif

        pfCredFree = (typeCredFree)GetProcAddress(hAdvapi32DLL, "CredFree");


        if( pfCredEnumerate == NULL||
            pfCredFree == NULL )
        {
            _tprintf(_T("Error loading Cred APIs\n"));
            break;
        }


        //Get an array of 'credential', satisfying the filter
        bOK = pfCredEnumerate(
                    _T("WindowsLive:name=*"),
                    0,
                    &dwCount,
                    &CredentialCollection
                    );


        if(FALSE == bOK)
        {
            _tprintf(_T("Error enumerating credentials\n"));
            break;
        }



        for(dwTempIndex=0; dwTempIndex<dwCount; dwTempIndex++)
        {           

            _tprintf(
                _T("Username : %s\n"),
                CredentialCollection[dwTempIndex]->UserName
                );
           
            _tprintf(
                _T("Password : %ws\n\n"),
                CredentialCollection[dwTempIndex]->CredentialBlob
                );
        }

        //Free credential collection
        pfCredFree(CredentialCollection);


    } while(false);


    //Free lib
    if(NULL != hAdvapi32DLL)
    {
        FreeLibrary(hAdvapi32DLL);
    }

    return TRUE;
}